using UnityEngine;

/// <summary>
/// 控制物体自动远离指定目标并添加随机移动行为的组件
/// 核心功能：
/// 1. 当目标物体进入安全距离时自动远离
/// 2. 随距离动态调整远离速度（近快远慢）
/// 3. 可添加随机方向偏移使移动更自然
/// 4. 支持限制在XZ平面移动
/// 使用方法：挂载到需要移动的物体上，并在Inspector指定目标物体
/// </summary>
public class AvoidObject : MonoBehaviour
{
    [Tooltip("需要远离的目标物体，通过拖拽赋值")]
    public Transform targetObject;

    [Tooltip("远离物体的基础速度")]
    public float avoidSpeed = 5f;

    [Tooltip("随机移动的基础速度")]
    public float randomMoveSpeed = 2f;

    [Tooltip("随机移动权重系数（0-1），控制随机移动在总速度中的占比")]
    [Range(0f, 1f)]
    public float randomMoveWeight = 0.5f;

    [Tooltip("最小安全距离，小于此距离时开始远离")]
    public float safeDistance = 3f;

    [Tooltip("随机方向更新间隔（秒）")]
    public float randomUpdateInterval = 0.5f;

    [Tooltip("是否限制在XZ平面移动")]
    public bool constrainToXZPlane = true;

    [Header("行为开关")]
    [Tooltip("是否启用远离物体功能")]
    public bool enableAvoidance = true;

    [Tooltip("是否启用随机移动功能")]
    public bool enableRandomMovement = true;

    [Header("运行时参数")]
    [Tooltip("上次更新随机方向的时间戳")]
    private float lastRandomUpdateTime;
    [Tooltip("当前随机偏移方向向量")]
    private Vector3 currentRandomOffset;

    /// <summary>
    /// 初始化随机偏移方向和时间戳
    /// </summary>
    private void Start()
    {
        // 记录初始随机更新时间
        lastRandomUpdateTime = Time.time;
        // 生成初始随机偏移方向
        currentRandomOffset = GenerateRandomOffset();
    }

    /// <summary>
    /// 每帧更新移动逻辑
    /// 流程：检查目标有效性 → 更新随机方向 → 计算目标方向 → 计算最终移动方向 → 计算动态速度 → 执行移动
    /// </summary>
    private void Update()
    {
        // 安全检查：如果未指定目标物体，则不执行任何操作
        if (targetObject == null)
        {
            Debug.LogWarning("AvoidObject: 未指定目标物体，请在Inspector面板中赋值");
            return;
        }

        // 定期更新随机偏移方向
        if (Time.time - lastRandomUpdateTime > randomUpdateInterval)
        {
            currentRandomOffset = GenerateRandomOffset();
            lastRandomUpdateTime = Time.time;
        }

        // 计算当前物体指向目标物体的方向向量
        Vector3 directionToTarget = targetObject.position - transform.position;
        
    
        
        // 计算物体与目标之间的直线距离
        float distanceToTarget = directionToTarget.magnitude;

        // 初始化最终移动方向：如果启用随机移动，则使用当前随机偏移方向
        // 初始化最终移动方向
        Vector3 finalDirection = Vector3.zero;

        // 如果启用随机移动，应用随机方向和速度
        if (enableRandomMovement)
        {
            finalDirection += currentRandomOffset * randomMoveSpeed * randomMoveWeight;
        }

        // 如果启用远离功能且目标在安全距离内，计算远离方向并叠加到最终方向
        if (enableAvoidance && distanceToTarget < safeDistance)
        {
            // 计算远离方向（目标方向的反方向，归一化确保长度为1）
            Vector3 awayDirection = -directionToTarget.normalized;
            // 应用远离方向和速度
            // 计算动态远离速度因子（近快远慢）
            float speedFactor = Mathf.Clamp01(1 - (distanceToTarget / safeDistance));
            finalDirection += awayDirection * avoidSpeed * speedFactor * (1 - randomMoveWeight);
        }

        // 再次应用XZ平面限制（防止随机偏移引入Y轴分量）
        if (constrainToXZPlane)
        {
            finalDirection.y = 0;
        }

        // 执行移动：方向 × 速度 × 时间增量
        transform.Translate(finalDirection * Time.deltaTime);
        // 强制移除Y轴分量，确保远离方向不影响Y轴位置
        directionToTarget.y = 0;
    }

    /// <summary>
    /// 生成随机偏移方向向量
    /// </summary>
    /// <returns>归一化的随机方向向量</returns>
    private Vector3 GenerateRandomOffset()
    {
        // 在单位球体内生成随机点（得到随机方向）
        Vector3 randomDir = Random.insideUnitSphere;
        
        // 强制移除Y轴分量，确保随机移动不影响Y轴位置
        randomDir.y = 0;
        
        // 归一化方向并应用强度系数
        // 归一化确保方向一致，强度系数控制随机移动的影响力
        return randomDir.normalized;
    }
}